import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

public class main {
    public static void main(String[] args){
        initial();
    }

    // Метод для ввода данных с консоли
    public static String input(){
        try (Scanner scanner = new Scanner(System.in)) {
            return scanner.nextLine();
        }
    }

    static String path;

    // Начальный метод для работы с пользователем
    public static void initial(){
        // Создаем экземпляры словарей
        DictNumb dictNumb = new DictNumb();
        DictWords dictWords = new DictWords();
        BaseDict dict;

        // Десериализуем словари из файлов
        dictNumb.deserialize("numdict");
        dictWords.deserialize("worddict");

        System.out.println();
        System.out.println("Введите:\n" +
                "1 - Словарь латинскими словами 4 буквы\n" +
                "2 - Словарь с числами 5 цифр\n" +
                "3 - Показать все");

        // Обрабатываем выбор пользователя
        switch (input()){
            case "1": 
            {
                path = getFilePath();
                while(path.isBlank()) { path = getFilePath(); }
                dict = new DictWords();
                dict.deserialize(path);
                opers(dict);
                break;
            }
            case "2":
            {
                path = getFilePath();
                while(path.isBlank()) { path = getFilePath(); }
                dict = new DictNumb();
                dict.deserialize(path);
                opers(dict);
                break;
            }
            case "3":
            {
                System.out.println("Словарь слов");
                dictWords.printAll();
                System.out.println("Словарь цифр");
                dictNumb.printAll();
                initial();
                break;
            }
            default: initial();
        }
    }

    // Метод для операций над словарем
    public static void opers(BaseDict dict){
        System.out.println();
        System.out.println("Выберите:\n" +
                "1 - Найти по ключу\n" +
                "2 - Добавить элемент\n" +
                "3 - Удалить элемент\n" +
                "4 - Посмотреть содержимое\n" +
                "5 - Назад");
        String index = input();
        switch (index){
            case "1":
            {
                find(dict);
                break;
            }
            case "2":
            {
                add(dict);
                break;
            }
            case "3":
            {
                remove(dict);
                break;
            }
            case "4":
            {
                show(dict);
                break;
            }
            case "5":
            {
                initial();
                break;
            }
            default:
            {
                opers(dict);
            }
        }
    }

    // Метод для поиска значений по ключу
    public static void find(BaseDict dict){
        System.out.println("Введите ключ");
        ArrayList<String> values;
        String str = input();
        if (dict.getByKey(str) != null) {
            values = dict.getByKey(str);
            if (!values.isEmpty()) {
                System.out.println("Значения в ключе: ");
                for (String value : values)
                    System.out.print(value + "; ");
                System.out.println();
            }
        }
        opers(dict);
    }

    // Метод для удаления элемента по ключу
    public static void remove(BaseDict dict){
        System.out.println("Введите ключ");
        dict.removeByKey(input());
        dict.serialize(path);
        opers(dict);
    }

    // Метод для отображения всех элементов словаря
    public static void show(BaseDict map){
        map.printAll();
        opers(map);
    }

    // Метод для добавления нового элемента в словарь
    public static void add(BaseDict dict){
        System.out.println("Введите ключ");
        String key = input();
        if (dict.Check(key)){
            String mask = dict.getMask();
            while(!key.matches(mask)){
                System.out.println("Неверный ключ");
                key = input();
            }
        }
        System.out.println("Введите значения через пробел");
        ArrayList<String> values = new ArrayList<>(Arrays.asList(input().split(" ")));
        dict.add(key, values);
        dict.serialize(path);
        opers(dict);
    }

    // Метод для получения пути к файлу от пользователя
    public static String getFilePath(){
        System.out.println("Введите имя файла без расширения:");
        String path1 = input();
        File f = new File(path1 + ".ser");
        if (!f.exists() || f.isDirectory()){
            return ""; 
        }
        return path1;
    }
}
